package com.three.iot.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.three.iot.api.ProductAttrService;
import com.three.iot.commons.dto.ProductAttrCondDto;
import com.three.iot.commons.dto.ProductAttrCreateDto;
import com.three.iot.commons.dto.ProductAttrRespDto;
import com.three.iot.commons.dto.ProductAttrUpadateDto;
import com.three.iot.commons.enums.DictTypeEnum;
import com.three.iot.commons.enums.Result;
import com.three.iot.commons.enums.RwFlagEnum;
import com.three.iot.commons.enums.StatusEnum;
import com.three.iot.commons.utils.DateUtil;
import com.three.iot.jdbc.dao.DictUtils;
import com.three.iot.jdbc.mapper.TProductAttrMapper;
import com.three.iot.jdbc.model.TProductAttr;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
@Slf4j
public class ProductAttrServiceImpl implements ProductAttrService {
    @Resource
    private TProductAttrMapper tProductAttrMapper;

    @Override
    public Result listPage(ProductAttrCondDto productAttrCondDto){
        //使用PageHelper类进行分页
        PageHelper.startPage(productAttrCondDto.getPageNum(), productAttrCondDto.getPageSize());
        Page<TProductAttr> productAttrPage =(Page<TProductAttr>) tProductAttrMapper.selectList(productAttrCondDto);
        Page<ProductAttrRespDto> productAttrRespDtoPage=new Page<ProductAttrRespDto>();
        BeanUtils.copyProperties(productAttrPage,productAttrRespDtoPage);
        List<TProductAttr> productAttrInfos=productAttrPage.getResult();
        for(TProductAttr tProductAttr:productAttrInfos){
            ProductAttrRespDto productAttrRespDto=buildSingRespDto(tProductAttr);
            productAttrRespDtoPage.add(productAttrRespDto);
        }
        PageInfo pageInfo = new PageInfo(productAttrRespDtoPage);
        return Result.newSuccess(pageInfo);
    }

    @Override
    public Result findAttrListByProducKey(String productKey) {
        List<TProductAttr> tProductAttrs=tProductAttrMapper.selectByProductKey(productKey);
        List<ProductAttrRespDto> productAttrRespDtoList=new ArrayList<>();
        for(TProductAttr tProductAttr:tProductAttrs){
            ProductAttrRespDto productAttrRespDto=buildSingRespDto(tProductAttr);
            productAttrRespDtoList.add(productAttrRespDto);
        }
        return Result.newSuccess(productAttrRespDtoList);
    }

    @Override
    public void create(ProductAttrCreateDto productAttrCreateDto) {
        TProductAttr oldProductAttr=tProductAttrMapper.selecByIndex(productAttrCreateDto.getProductKey(),productAttrCreateDto.getAttrNo());
        if(oldProductAttr!=null){
            return;
        }
        TProductAttr tProductAttr=new TProductAttr();
        BeanUtils.copyProperties(productAttrCreateDto,tProductAttr);
        tProductAttr.setCreateNo(productAttrCreateDto.getOperUserNo());
        tProductAttr.setCreateTime(new Date());
        tProductAttr.setModiNo(productAttrCreateDto.getOperUserNo());
        tProductAttr.setModiTime(new Date());
        if(StringUtils.isNoneEmpty(productAttrCreateDto.getStatus())){
            tProductAttr.setStatus(Integer.valueOf(productAttrCreateDto.getStatus()));
        }
        if(StringUtils.isNoneEmpty(productAttrCreateDto.getRwFlag())){
            tProductAttr.setRwFlag(Integer.valueOf(productAttrCreateDto.getRwFlag()));
        }
        if(StringUtils.isNoneEmpty(productAttrCreateDto.getSortNum())){
            tProductAttr.setSortNum(Integer.valueOf(productAttrCreateDto.getSortNum()));
        }
        tProductAttrMapper.insertSelective(tProductAttr);
    }

    @Override
    public void update(ProductAttrUpadateDto productAttrUpadateDto) {
        TProductAttr tProductAttr=new TProductAttr();
        BeanUtils.copyProperties(productAttrUpadateDto,tProductAttr);
        tProductAttr.setModiNo(productAttrUpadateDto.getOperUserNo());
        tProductAttr.setModiTime(new Date());
        if(StringUtils.isNoneEmpty(productAttrUpadateDto.getStatus())){
            tProductAttr.setStatus(Integer.valueOf(productAttrUpadateDto.getStatus()));
        }
        if(StringUtils.isNoneEmpty(productAttrUpadateDto.getRwFlag())){
            tProductAttr.setRwFlag(Integer.valueOf(productAttrUpadateDto.getRwFlag()));
        }
        if(StringUtils.isNoneEmpty(productAttrUpadateDto.getSortNum())){
            tProductAttr.setSortNum(Integer.valueOf(productAttrUpadateDto.getSortNum()));
        }
        tProductAttrMapper.updateByPrimaryKeySelective(tProductAttr);
    }

    @Override
    public void delete(String id) {
        tProductAttrMapper.deleteByPrimaryKey(Integer.valueOf(id));
    }

    @Override
    public ProductAttrRespDto findAttrByIndex(String productKey, String attrNo) {
        TProductAttr tProductAttr=tProductAttrMapper.selecByIndex(productKey,attrNo);
        if(tProductAttr==null) return null;
        return buildSingRespDto(tProductAttr);
    }

    private ProductAttrRespDto buildSingRespDto(TProductAttr tProductAttr) {
        ProductAttrRespDto productAttrRespDto=new ProductAttrRespDto();
        BeanUtils.copyProperties(tProductAttr,productAttrRespDto);
        productAttrRespDto.setStatus(tProductAttr.getStatus().toString());
        productAttrRespDto.setStatusName(StatusEnum.getNameByCode(tProductAttr.getStatus()));
        productAttrRespDto.setShowTypeNo(DictUtils.getDictValueByUniq(DictTypeEnum.ATTR_UNIT,productAttrRespDto.getAttrUnit()));
        productAttrRespDto.setShowTypeName(DictUtils.getNameByUniq(DictTypeEnum.SHOW_TYPE,productAttrRespDto.getShowTypeNo()));
        String rwFlag=tProductAttr.getRwFlag()==null?"0":tProductAttr.getRwFlag().toString();
        productAttrRespDto.setRwFlag(rwFlag);
        productAttrRespDto.setRwFlagName(RwFlagEnum.getNameByCode(Integer.valueOf(productAttrRespDto.getRwFlag())));
        Integer sortNum=tProductAttr.getSortNum()==null?0:tProductAttr.getSortNum();
        productAttrRespDto.setSortNum(sortNum);
        productAttrRespDto.setCreateTime(DateUtil.getDateTimeFormat(tProductAttr.getCreateTime()));
        productAttrRespDto.setModiTime(DateUtil.getDateTimeFormat(tProductAttr.getModiTime()));
        productAttrRespDto.setGroupName(DictUtils.getNameByUniq(DictTypeEnum.DEVICE_GROUP,tProductAttr.getGroupNo()));
        productAttrRespDto.setAttrUnitName(DictUtils.getNameByUniq(DictTypeEnum.ATTR_UNIT,productAttrRespDto.getAttrUnit()));
        productAttrRespDto.setAttrDataTypeName(DictUtils.getNameByUniq(DictTypeEnum.ATTR_DATA_TYPE,productAttrRespDto.getAttrDataType()));
        return productAttrRespDto;
    }

}
